package net.java.action.seguridad;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import net.java.action.comun.BaseAction;

import org.apache.log4j.Logger;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;

import com.opensymphony.xwork2.inject.Scope;
import com.opensymphony.xwork2.inject.Scoped;

import dawi.fcs.dominio.Miscelaneos;
import dawi.fcs.dominio.seguridad.Perfil;
import dawi.fcs.dominio.seguridad.Usuario;
import dawi.fcs.dominio.seguridad.UsuarioPerfil;
import dawi.fcs.servicio.generico.UIMantenimientoController;
import dawi.fcs.servicio.generico.UValidador;

@SuppressWarnings("serial")
@ParentPackage(value = "DAWI-FCS-WEB")
@Scoped(value = Scope.SESSION)
public class UsuarioAction extends BaseAction implements
		UIMantenimientoController {
	private static final Logger logger = Logger.getLogger(UsuarioAction.class);
	private Usuario bean;
	private UsuarioPerfil uperfil;
	private Usuario registroSeleccionado;
	private List<Usuario> lstUsuario;
	private List<Perfil> lstPerfil;
	private List<Miscelaneos> lstEspecialidad;
	private List<Miscelaneos> lstCargo;
	private Usuario filtro;
	private String accion_pantalla;
	private String titulo;
	private String renderTab;
	private boolean soloLectura;

	public UsuarioAction() {
		filtro = new Usuario();
		registroSeleccionado = new Usuario();

	}

	@Override
	@Action(value = "/iniciarCUsuario", results = { @Result(name = "success", location = "usuarioListado", type = "tiles") })
	public String iniciarControladora() throws Exception {
		inicializarFiltrosListado();
		this.buscar();
		return SUCCESS;
	}

	@Action(value = "/cargaPerfil", results = { @Result(name = "success", type = "json") })
	public String cargarPerfil() {
		lstPerfil = getPerfilServicio().listarPerfil();
		if (UValidador.esNulo(lstPerfil))
			lstPerfil = new ArrayList<Perfil>();
		return SUCCESS;
	}

	@Action(value = "/cargaEspecialidad", results = { @Result(name = "success", type = "json") })
	public String cargaEspecialidad() {
		logger.debug("cargando esp's");
		lstEspecialidad = getMiscelaneosServicio().listarEspecialidades();
		logger.debug(lstEspecialidad.size());
		if (UValidador.esListaVacia(lstEspecialidad))
			lstEspecialidad = new ArrayList<Miscelaneos>();
		return SUCCESS;
	}

	@Action(value = "/cargaCargo", results = { @Result(name = "success", type = "json") })
	public String cargaCargo() {
		logger.debug("cargando cargos");
		lstCargo = getMiscelaneosServicio().listarCargos();
		logger.debug(lstCargo.size());
		if (UValidador.esListaVacia(lstCargo))
			lstCargo = new ArrayList<Miscelaneos>();
		return SUCCESS;
	}

	@Override
	@Action(value = "/buscaUsuario", results = { @Result(name = "success", location = "usuarioListado", type = "tiles") })
	public String buscar() throws Exception {

		HashMap<String, Object> parametros = new HashMap<String, Object>();

		if (UValidador.estaVacio(filtro.getAppater()))
			filtro.setAppater(null);
		if (UValidador.estaVacio(filtro.getCodigo()))
			filtro.setCodigo(null);
		if (UValidador.estaVacio(filtro.getDni()))
			filtro.setDni(null);
		if (UValidador.estaVacio(filtro.getEstado()))
			filtro.setEstado(null);

		parametros.put("appater", filtro.getAppater());
		parametros.put("codigo", filtro.getCodigo());
		parametros.put("dni", filtro.getDni());
		parametros.put("estado", filtro.getEstado());

		lstUsuario = getUsuarioServicio().listarPaginacion(parametros);

		return SUCCESS;
	}

	@Override
	@Action(value = "/nuevoUsuario", results = { @Result(name = "success", location = "UsuarioMant", type = "tiles") })
	public String nuevo() throws Exception {
		bean = new Usuario();
		accion_pantalla = "NUEVO";
		getSession().put("accion_pantalla", accion_pantalla);
		titulo = "Empleado - Nuevo";
		soloLectura = false;
		this.setAuditoriaNuevo();
		getSession().put("LECTURA", soloLectura);
		return SUCCESS;
	}

	@Override
	@Action(value = "/editaUsuario", results = { @Result(name = "success", location = "UsuarioMant", type = "tiles") })
	public String editar() throws Exception {
		inicializarDatosMantenimiento();
		bean = (Usuario) getUsuarioServicio()
				.obtenerPorId(registroSeleccionado);
		titulo = "Empleado - Editar( " + bean.getAppater() + " "
				+ bean.getApmater() + " " + bean.getNombre() + " )";
		this.setAuditoriaModificar(bean);
		uperfil.setCodUsu(bean.getCodigo());
		obtenerPerfil();
		accion_pantalla = "EDITAR";
		getSession().put("accion_pantalla", accion_pantalla);
		soloLectura = true;
		getSession().put("CREACION_USUARIO", bean.getCreacionUsuario());
		getSession().put("CREACION_FECHA", bean.getCreacionFecha());
		getSession().put("LECTURA", soloLectura);
		return SUCCESS;
	}

	@Override
	public String ver() throws Exception {
		return null;
	}

	@Override
	@Action(value = "/eliminaUsuario", results = { @Result(name = "success", location = "usuarioListado", type = "tiles") })
	public String eliminar() throws Exception {
		bean = (Usuario) getUsuarioServicio()
				.obtenerPorId(registroSeleccionado);
		getUsuarioServicio().eliminar(bean);
		buscar();
		return SUCCESS;
	}

	@Override
	@Action(value = "/inactivaUsuario", results = { @Result(name = "success", location = "usuarioListado", type = "tiles") })
	public String inactivar() throws Exception {
		bean = (Usuario) getUsuarioServicio()
				.obtenerPorId(registroSeleccionado);
		bean.setEstado("I");
		bean = (Usuario) this.getAuditoriaModificar(bean);
		getUsuarioServicio().actualizar(bean);
		buscar();
		addActionMessage("El registro con codigo " + bean.getCodigo()
				+ " se inactivo correctamente.");
		return SUCCESS;
	}

	@Override
	@Action(value = "/guardarUsuario", results = {
			@Result(name = "success", location = "usuarioListado", type = "tiles"),
			@Result(name = "error", location = "UsuarioMant", type = "tiles"),
			@Result(name = "input", location = "UsuarioMant", type = "tiles") })
	public String guardar() throws Exception {
		if (!validar()) {
			if (!UValidador.esNulo(getSession().get("LECTURA")))
				soloLectura = (boolean) getSession().get("LECTURA");
			getSession().remove("LECTURA");
			return ERROR;
		}

		if (!validaDNI()) {
			return ERROR;
		}
		logger.debug("valido");

		if (getSession().get("accion_pantalla").toString().equals("NUEVO")) {
			bean = (Usuario) this.getAuditoriaNuevo(bean);
			getUsuarioServicio().registrar(bean);
			addActionMessage("El Usuario  " + bean.getNombre()
					+ " se registro correctamente.");
		}

		if (getSession().get("accion_pantalla").toString().equals("EDITAR")) {
			bean.setCreacionFecha((String) getSession().get("CREACION_FECHA"));
			bean.setCreacionUsuario((String) getSession().get(
					"CREACION_USUARIO"));
			bean = (Usuario) this.getAuditoriaModificar(bean);
			getUsuarioServicio().actualizar(bean);
			addActionMessage("El registro  " + bean.getNombre()
					+ " se actualizo correctamente.");
			getSession().remove("CREACION_FECHA");
			getSession().remove("CREACION_USUARIO");
		}
		if (bean.getEsUsuariobool()) {
			logger.debug(UValidador.esNulo(uperfil));
			logger.debug(UValidador.esNulo(bean));
			logger.debug(UValidador.esNulo(bean.getCodigo()));
			if (UValidador.esNulo(uperfil))
				uperfil = new UsuarioPerfil();
			uperfil.setCodUsu(bean.getCodigo());
			guardaPerfil();
		}

		buscar();

		return SUCCESS;
	}

	private Boolean validaDNI() {
		if (getSession().get("accion_pantalla").toString().equals("NUEVO")) {
			HashMap<String, Object> map = new HashMap<String, Object>();
			map.put("dni", bean.getDni());
			Integer dni = 0;
			dni = getUsuarioServicio().validaDNI(map);

			if (dni > 0) {
				addActionMessage("El dni ya se encuentra registrado.");
				return false;
			} else {
				return true;
			}
		} else {
			return true;
		}
	}

	private void registraPerfil() {
		if (!UValidador.esNulo(uperfil.getCodUsu())
				&& !UValidador.esNulo(uperfil.getCodPerfil())) {
			if (!UValidador.estaVacio(uperfil.getCodUsu())
					&& !UValidador.estaVacio(uperfil.getCodPerfil())) {
				getPerfilServicio().insertaUsuPerfil(uperfil);
			}
		}
	}

	private void actualizaPerfil() {
		if (!UValidador.esNulo(uperfil.getCodUsu())
				&& !UValidador.esNulo(uperfil.getCodPerfil())) {
			if (!UValidador.estaVacio(uperfil.getCodUsu())
					&& !UValidador.estaVacio(uperfil.getCodPerfil())) {
				try {
					getPerfilServicio().actualizaUsuPerfil(uperfil);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

	private void guardaPerfil() {
		HashMap<String, Object> param = new HashMap<String, Object>();
		param.put("idUsuario", bean.getCodigo());
		List<Perfil> perfiles = getPerfilServicio().listarPerfilxUsuario(param);
		if (perfiles.size() < 1) {
			registraPerfil();
		} else {

			actualizaPerfil();
		}
	}

	private void obtenerPerfil() {
		HashMap<String, Object> param = new HashMap<String, Object>();
		param.put("idUsuario", bean.getCodigo());
		List<Perfil> perfiles = getPerfilServicio().listarPerfilxUsuario(param);
		if (UValidador.esNulo(perfiles) || UValidador.esListaVacia(perfiles)) {
		} else {
			uperfil.setCodPerfil(perfiles.get(0).getId());
		}
	}

	@Override
	public String salir() throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Boolean validar() throws Exception {
		logger.debug("Validando!");
		logger.debug(bean.getCargo());
		logger.debug(bean.getEspecialidad());
		boolean valida = true;
		if (UValidador.estaVacio(bean.getDni())) {
			addFieldError("bean.dni", "*");
			valida = false;
		}
		if (UValidador.estaVacio(bean.getNombre())) {
			addFieldError("bean.nombre", "*");
			valida = false;
		}
		if (UValidador.estaVacio(bean.getAppater())) {
			addFieldError("bean.appater", "*");
			valida = false;
		}
		if (UValidador.estaVacio(bean.getApmater())) {
			addFieldError("bean.apmater", "*");
			valida = false;
		}

		if (bean.getCargo().equals(" ")) {
			addFieldError("bean.cargo", "*");
			valida = false;
		}

		if (bean.getEspecialidad().equals(" ")) {
			addFieldError("bean.especialidad", "*");
			valida = false;
		}

		if (bean.getEsUsuariobool()) {
			if (!UValidador.esNulo(uperfil)) {
				if (uperfil.getCodPerfil().equals(" ")) {
					addFieldError("uperfil.codPerfil", "*");
					valida = false;
				}
			}
			if (UValidador.estaVacio(bean.getUser())) {
				addFieldError("bean.user", "*");
				valida = false;
			}
			if (UValidador.estaVacio(bean.getPass())) {
				addFieldError("bean.pass", "*");
				valida = false;
			}
		}

		return valida;
	}

	@Action(value = "/onCheckBoxChange", results = { @Result(name = "success", location = "UsuarioMant", type = "tiles") })
	public String onCheckBoxChange() {
		logger.debug(bean.getEsUsuariobool());
		return SUCCESS;
	}

	@Override
	public String prepararDatosMantenimiento() throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String prepararDatosListado() throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String inicializarFiltrosListado() throws Exception {
		filtro = new Usuario();
		return null;
	}

	@Override
	public String inicializarDatosMantenimiento() throws Exception {
		uperfil = new UsuarioPerfil();
		return null;
	}

	public Usuario getBean() {
		return bean;
	}

	public void setBean(Usuario bean) {
		this.bean = bean;
	}

	public List<Usuario> getLstUsuario() {
		return lstUsuario;
	}

	public void setLstUsuario(List<Usuario> lstUsuario) {
		this.lstUsuario = lstUsuario;
	}

	public Usuario getFiltro() {
		return filtro;
	}

	public void setFiltro(Usuario filtro) {
		this.filtro = filtro;
	}

	public Usuario getRegistroSeleccionado() {
		return registroSeleccionado;
	}

	public void setRegistroSeleccionado(Usuario registroSeleccionado) {
		this.registroSeleccionado = registroSeleccionado;
	}

	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public boolean getSoloLectura() {
		return soloLectura;
	}

	public void setSoloLectura(boolean soloLectura) {
		this.soloLectura = soloLectura;
	}

	public List<Perfil> getLstPerfil() {
		return lstPerfil;
	}

	public void setLstPerfil(List<Perfil> lstPerfil) {
		this.lstPerfil = lstPerfil;
	}

	public UsuarioPerfil getUperfil() {
		return uperfil;
	}

	public void setUperfil(UsuarioPerfil uperfil) {
		this.uperfil = uperfil;
	}

	public List<Miscelaneos> getLstEspecialidad() {
		return lstEspecialidad;
	}

	public void setLstEspecialidad(List<Miscelaneos> lstEspecialidad) {
		this.lstEspecialidad = lstEspecialidad;
	}

	public List<Miscelaneos> getLstCargo() {
		return lstCargo;
	}

	public void setLstCargo(List<Miscelaneos> lstCargo) {
		this.lstCargo = lstCargo;
	}

	public String getRenderTab() {
		return renderTab;
	}

	public void setRenderTab(String renderTab) {
		this.renderTab = renderTab;
	}

}
